package com.yangxf.d_processVariables;

import java.io.InputStream;
import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;

public class ProcessVariablesTest {

	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**
	 * 部署流程定义（从inputstream）
	 */
	@Test
	public void deploymentProcessDefinition_inputStream() {
		
		InputStream inputStreambpmn = this.getClass().getResourceAsStream("/diagrams/processVariables.bpmn");
		InputStream inputStreampng = this.getClass().getResourceAsStream("/diagrams/processVariables.png");
		
		Deployment deployment = processEngine.getRepositoryService() // 流程定义、部署对象 所使用的service
				.createDeployment() // 创建部署对象
				.name("我的流程定义") // 输入框 部署名称
				.addInputStream("processVariables.bpmn", inputStreambpmn) // （与资源文件名必须相同）
				.addInputStream("processVariables.png", inputStreampng) // （与资源文件名必须相同）
				.deploy(); // 完成部署
		
		System.out.println("部署id："+deployment.getId());
		System.out.println("部署名称："+deployment.getName());
	}
	
	/**
	 * 启动流程实例
	 */
	@Test
	public void startProcessInstance() {
		
		String processDefinitionKey = "processVariables";
		
		ProcessInstance pi = processEngine.getRuntimeService() // 正在执行的流程实例和对象相关service
			.startProcessInstanceByKey(processDefinitionKey); // 使用流程定义的key启动流程实例
		
		System.out.println("流程实例id："+pi.getId());
		System.out.println("流程定义id："+pi.getProcessDefinitionId());
	}
	
	/**
	 * 设置流程变量
	 */
	@Test
	public void setVariables() {
		TaskService taskService = processEngine.getTaskService();
		//任务id
		String taskId = "57502";
		
		//流程变量使用基本类型
//		taskService.setVariableLocal(taskId, "请假天数", 5); // 与任务id绑定
//		taskService.setVariable(taskId, "请假天数", 3);
//		taskService.setVariable(taskId, "请假日期", new Date());
//		taskService.setVariable(taskId, "请假原因", "回家相亲尼玛");
		
		//流程变量使用JavaBean类型
		SomeBody sb = new SomeBody(); // 存储的JavaBean不可再增加字段，否则取出时无法程序无法辨别，序列化后可以
		sb.setId("1");
		sb.setName("小猪佩奇社会人");
		taskService.setVariable(taskId, "人员信息", sb);
		
		System.out.println("流程变量设置成功！");
	}
	
	/**
	 * 获取流程变量
	 */
	@Test
	public void getVariables() {
		TaskService taskService = processEngine.getTaskService();
		//任务id
		String taskId = "57502";
		
//		获取流程变量使用基本类型
//		Integer days = (Integer) taskService.getVariable(taskId, "请假天数");
//		Date date = (Date) taskService.getVariable(taskId, "请假日期");
//		String resean = (String) taskService.getVariable(taskId, "请假原因");
//		System.out.println(days + " " + date + " " + resean);
		
//		获取流程变量，使用javabean类型
		SomeBody sb = (SomeBody)taskService.getVariable(taskId, "人员信息");
		System.out.println(sb.getId() + "      " + sb.getName());
		
	}
	
	
	/**
	 * 模拟设置和获取流程变量的场景
	 */
	@Test
	public void setAndGetVariables() {
		RuntimeService runtimeService = processEngine.getRuntimeService();
		TaskService taskService = processEngine.getTaskService();
		
//		runtimeService.setVariable(executionId, variableName, value); // 使用执行对象id，流程变量的名称，设置流程变量的值
//		runtimeService.setVariables(executionId, variables); // 使用执行对象id map集合设置流程变量 map集合的key就是流程变量的名称，map集合的value就是流程变量的值
		
//		taskService.setVariable(taskId, variableName, value); // 使用任务id，流程变量的名称，设置流程变量的值
//		taskService.setVariables(taskId, variables); // 使用任务id，map集合设置流程变量，同上
		
//		runtimeService.startProcessInstanceByKey(processDefinitionKey, variables); // 启动流程实例时，设置流程变量，用map集合
//		taskService.complete(taskId, variables); // 完成任务时设置流程变量
		
//		runtimeService.getVariable(executionId, variableName); // 使用执行对象id和流程变量名称，获取流程变量的值
//		runtimeService.getVariables(executionId); // 使用执行对象id，获取所有流程变量，将流程变量放到map集合中
//		runtimeService.getVariables(executionId, variableNames); // 执行对象id，获取流程变量的值，设置流程变量的名称存放到集合中，获取相应流程变量的值，值存到map
		
//		taskService.getVariable(taskId, variableName); // 使用任务id和流程变量名称，获取流程变量的值
//		taskService.getVariables(taskId); // 使用任务id，获取所有流程变量，将流程变量放到map集合中
//		taskService.getVariables(taskId, variableNames); // 使用任务id，获取流程变量的值，设置流程变量的名称存放到集合中，获取相应流程变量的值，值存到map
		
		
	}
	
	
	/**
	 * 完成我的任务
	 */
	@Test
	public void completeMission() {
		
		//任务id
		String taskId = "57502";
		processEngine.getTaskService() // 正在执行的任务相关的service
			.complete(taskId);
		System.out.println("完成任务id：" + taskId);
	}
	
	/**
	 * 查询流程变量的历史
	 */
	@Test
	public void findHistoryProcessVariable() {
		
		String variableName = "请假天数";
		
		List<HistoricVariableInstance> list = processEngine.getHistoryService()
			.createHistoricVariableInstanceQuery() // 历史变量流程查询对象
			.variableName(variableName)
			.list();
		
		if(list!=null && list.size()>0) {
			for(HistoricVariableInstance hvi : list) {
				System.out.println(hvi.getId()+" "+
						hvi.getProcessInstanceId()+" "+hvi.getVariableName()+" "+
						hvi.getVariableTypeName()+" "+hvi.getValue());
				System.out.println("###############################################");
			}
		}
	}
}
